package com.nicolas.pattern.mediator;

/**
 * 如果在一个系统中对象之间存在多对多的相互关系，我们可以将对象之间的一些交互行为从各个对象中分离出来，
 * 并集中封装在一个中介者对象中，并由该中介者进行统一协调，这样对象之间多对多的复杂关系就转化为相对简单的一对多关系。
 * 通过引入中介者来简化对象之间的复杂交互，中介者模式是“迪米特法则”的一个典型应用。

中介者模式定义如下：

中介者模式(Mediator Pattern)：用一个中介对象（中介者）来封装一系列的对象交互，
中介者使各对象不需要显式地相互引用，从而使其耦合松散，而且可以独立地改变它们之间的交互。
中介者模式又称为调停者模式，它是一种对象行为型模式。

在中介者模式中，我们引入了用于协调其他对象/类之间相互调用的中介者类，
为了让系统具有更好的灵活性和可扩展性，通常还提供了抽象中介者
 * @author cuilj --2017年2月13日 下午4:36:13
 *
 *使用了中介者模式，在原有系统中增加新的组件（即新的同事类）将变得很容易
 *不修改原有具体中介者类ConcreteMediator的代码，
 *而是增加一个ConcreteMediator的子类SubConcreteMediator来实现对Label对象的引用，
 *然后在新增的中介者类SubConcreteMediator中通过覆盖componentChanged()方法来实现所有组件
 *（包括新增Label组件）之间的交互，同样，原有组件类无须做任何修改，客户端代码需少许修改
 */
public class MediatorMain {
	public static void main(String args[]) {  
//        //定义中介者对象  
//        ConcreteMediator mediator;  
//        mediator = new ConcreteMediator();  
          
        //用新增具体中介者定义中介者对象  
        SubConcreteMediator mediator;  
        mediator = new SubConcreteMediator();  
        
        //定义同事对象  
        Button addBT = new Button();  
        List list = new List();  
        ComboBox cb = new ComboBox();  
        TextBox userNameTB = new TextBox();  
        Label label = new Label();  
  
        addBT.setMediator(mediator);  
        list.setMediator(mediator);  
        cb.setMediator(mediator);  
        userNameTB.setMediator(mediator);  
        label.setMediator(mediator);  
  
        mediator.addButton = addBT;  
        mediator.list = list;  
        mediator.cb = cb;  
        mediator.userNameTextBox = userNameTB;  
        mediator.label = label;  
        
        addBT.changed();  
        System.out.println("-----------------------------");  
        list.changed();  
    }  
}
